/*
 * Deal with duplicated lines in a file
 */
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int fields;
int letters;
int linec;
char    mode;
int uniq;
char    *skip();

main(argc, argv)
int argc;
char *argv[];
{
    static char b1[1000], b2[1000];

    while(argc > 1) {
        if(*argv[1] == '-') {
            if (isdigit(argv[1][1]))
                fields = atoi(&argv[1][1]);
            else mode = argv[1][1];
            argc--;
            argv++;
            continue;
        }
        if(*argv[1] == '+') {
            letters = atoi(&argv[1][1]);
            argc--;
            argv++;
            continue;
        }
        if (freopen(argv[1], "r", stdin) == NULL)
            printe("cannot open %s\n", argv[1]);
        break;
    }
    if(argc > 2 && freopen(argv[2], "w", stdout) == NULL)
        printe("cannot create %s\n", argv[2]);

    if(gline(b1))
        exit(0);
    for(;;) {
        linec++;
        if(gline(b2)) {
            pline(b1);
            exit(0);
        }
        if(!equal(b1, b2)) {
            pline(b1);
            linec = 0;
            do {
                linec++;
                if(gline(b1)) {
                    pline(b2);
                    exit(0);
                }
            } while(equal(b1, b2));
            pline(b2);
            linec = 0;
        }
    }
}

gline(buf)
register char buf[];
{
    register c;

    while((c = getchar()) != '\n') {
        if(c == EOF)
            return(1);
        *buf++ = c;
    }
    *buf = 0;
    return(0);
}

pline(buf)
register char buf[];
{

    switch(mode) {

    case 'u':
        if(uniq) {
            uniq = 0;
            return;
        }
        break;

    case 'd':
        if(uniq) break;
        return;

    case 'c':
        printf("%4d ", linec);
    }
    uniq = 0;
    fputs(buf, stdout);
    putchar('\n');
}

equal(b1, b2)
register char b1[], b2[];
{
    register char c;

    b1 = skip(b1);
    b2 = skip(b2);
    while((c = *b1++) != 0)
        if(c != *b2++) return(0);
    if(*b2 != 0)
        return(0);
    uniq++;
    return(1);
}

char *
skip(s)
register char *s;
{
    register nf, nl;

    nf = nl = 0;
    while(nf++ < fields) {
        while(*s == ' ' || *s == '\t')
            s++;
        while( !(*s == ' ' || *s == '\t' || *s == 0) )
            s++;
    }
    while(nl++ < letters && *s != 0)
            s++;
    return(s);
}

printe(p,s)
char *p,*s;
{
    fprintf(stderr, p, s);
    exit(1);
}
